// Challenges.cs
//

using System;
using System.Collections.Generic;
using System.Diagnostics;
using SharpLZW;

namespace TuringMachine
{


   public enum AcceptState { Accept = 1, Reject = 2, DontCare = 0 };

   public class ChallengeTest
   {
      public string pInputString;
      public string pExpectedOutputString;
      public AcceptState pExpectedAcceptance;

      public ChallengeTest(string input, string output, AcceptState accept)
      {
         pInputString = input;
         pExpectedOutputString = output;
         pExpectedAcceptance = accept;
      }
   }

   public class Challenge
   {
      public string pDescription;
      public string pName;
      public List<ChallengeTest> pTests = new List<ChallengeTest>();
      public int pCredits;

      public Challenge(string name)
      {
         pName = name;
      }

      public static List<Challenge> ChallengeList;
      public static void CreateChallenges()
      {
         Challenge challenge;
         ChallengeList = new List<Challenge>();

         // |353-:########
         challenge = new Challenge("One first");
         challenge.pDescription = "Overwrite the first bit with a one. String has at least one bit";
         challenge.pCredits = 1;
         challenge.pTests.Add(new ChallengeTest("0", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("01", "11", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("001", "101", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10", "10", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("11", "11", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("110", "110", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("111", "111", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0000", "1000", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0001", "1001", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0010", "1010", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0110", "1110", AcceptState.DontCare));
         ChallengeList.Add(challenge);

         // |56i145343-|124-:#######
         challenge = new Challenge("One last");
         challenge.pDescription = "Overwrite the last bit with a one. String has at least one bit";
         challenge.pCredits = 1;
         challenge.pTests.Add(new ChallengeTest("0", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("01", "01", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("001", "001", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10", "11", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("11", "11", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("110", "111", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("111", "111", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0000", "0001", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0001", "0001", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0010", "0011", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0110", "0111", AcceptState.DontCare));
         ChallengeList.Add(challenge);

         // |36i543-.########
         challenge = new Challenge("One less");
         challenge.pDescription = "Remove the first bit, but only if it is a one";
         challenge.pCredits = 1;
         challenge.pTests.Add(new ChallengeTest("0", "0", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1", "", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("01", "01", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("001", "001", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10", "0", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("11", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("110", "10", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("111", "11", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0000", "0000", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0001", "0001", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0010", "0010", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0110", "0110", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1001", "001", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1010", "010", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1110", "110", AcceptState.DontCare));
         ChallengeList.Add(challenge);

         // |36i563-.|.194-.#######
         challenge = new Challenge("No ones");
         challenge.pDescription = "Remove all ones at the front of the string";
         challenge.pCredits = 1;
         challenge.pTests.Add(new ChallengeTest("0", "0", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1", "", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("01", "01", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("001", "001", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10", "0", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("11", "", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("110", "0", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("111", "", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0000", "0000", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0001", "0001", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0010", "0010", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0110", "0110", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1000", "000", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1001", "001", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1010", "010", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1110", "0", AcceptState.DontCare));
         ChallengeList.Add(challenge);

         // |26i14426i-|:119-#######
         challenge = new Challenge("Down");
         challenge.pDescription = "Accept all strings beginning with exactly one zero";
         challenge.pCredits = 1;
         challenge.pTests.Add(new ChallengeTest("", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("0", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("1", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("10", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("01", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("110", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("011", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("111", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("000", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("0111", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("0011", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("0001", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("01111", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("11011", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("00111", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("000110", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("001111", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("011011", null, AcceptState.Accept));
         ChallengeList.Add(challenge);


         // |54k154-.|11919458i-#######
         challenge = new Challenge("Even");
         challenge.pDescription = "Accept if the difference between the amount of ones and the amount of zeroes is an even number";
         challenge.pCredits = 3;
         challenge.pTests.Add(new ChallengeTest("", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("0", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("1", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("10", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("01", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("110", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("011", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("111", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("000", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("0111", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("0011", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("0001", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("01111", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("11011", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("00111", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("000110", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("001111", null, AcceptState.Accept));
         ChallengeList.Add(challenge);


         // |151-:|14424k56i243119_:|.593124-######
         challenge = new Challenge("Double");
         challenge.pDescription = "Return a binary number which is the result of multiply the input number by 2";
         challenge.pCredits = 3;
         challenge.pTests.Add(new ChallengeTest("", "0", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0", "0", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1", "10", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("01", "10", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("001", "10", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10", "100", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("11", "110", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("110", "1100", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("111", "1110", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("010101", "101010", AcceptState.DontCare));
         ChallengeList.Add(challenge);

         // |25i543144243_:.|.543144343_:.#######
         challenge = new Challenge("Second out");
         challenge.pDescription = "Remove the second bit in the string (e.g. 1011 becomes 111). Input string hat at least two bits";
         challenge.pCredits = 3;
         challenge.pTests.Add(new ChallengeTest("01", "0", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("001", "01", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("11", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("110", "10", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("111", "11", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0000", "000", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0001", "001", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0010", "010", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0110", "010", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("010101", "00101", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("010111", "00111", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("011101", "01101", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("110101", "10101", AcceptState.DontCare));
         ChallengeList.Add(challenge);



         // |151.171181_:.|.54k34k363191_:|:243134_:.######
         challenge = new Challenge("Invert");
         challenge.pDescription = "Replace zeroes by ones and ones by zeroes";
         challenge.pCredits = 5;
         challenge.pTests.Add(new ChallengeTest("", "", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1", "0", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("01", "10", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("001", "110", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10", "01", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("11", "00", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("110", "001", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("111", "000", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0000", "1111", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0001", "1110", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0010", "1101", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0110", "1001", AcceptState.DontCare));
         ChallengeList.Add(challenge);

         // |151:171184_:|.27i54k23i14457k_.|_191119_.######
         challenge = new Challenge("Mountain");
         challenge.pDescription = "Accept all strings which begin and end with a zero";
         challenge.pCredits = 5;
         challenge.pTests.Add(new ChallengeTest("", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("0", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("00", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("10", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("01", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("11", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("010", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("000", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("0110", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("0000", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("0111", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("01110", null, AcceptState.Accept));
         ChallengeList.Add(challenge);





         // |54k26i14454k26i14454k26i:.|119194.119171.119171:.|:191181.191181_######
         challenge = new Challenge("Three's a crowd");
         challenge.pDescription = "Accept if the string has no more than two consecutive zeroes";
         challenge.pCredits = 7;
         challenge.pTests.Add(new ChallengeTest("", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("0", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("00", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("01", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("11", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("000", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("011", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("101", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("111", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("1110", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("0110", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("1101", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("1000", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("01110", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("10001", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("111000", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("101010", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("101001", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("110001", null, AcceptState.Reject));
         ChallengeList.Add(challenge);



         // |54k36i14454k36i14454k36i119:|.194:194:194:.#######
         challenge = new Challenge("Three ones");
         challenge.pDescription = "Accept all strings which have at least three ones";
         challenge.pCredits = 7;
         challenge.pTests.Add(new ChallengeTest("", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("0", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("00", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("01", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("11", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("000", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("011", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("101", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("111", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("1110", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("1101", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("01110", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("111000", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("100010001", null, AcceptState.Accept));
         ChallengeList.Add(challenge);




         // |54k26i14454k26i14454k26i:.|.194:194.119194:.#######
         challenge = new Challenge("Zero pair");
         challenge.pDescription = "Accept all strings which have exactly two zeroes";
         challenge.pCredits = 7;
         challenge.pTests.Add(new ChallengeTest("", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("0", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("1", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("00", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("10", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("01", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("11", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("010", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("111", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("000", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("0110", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("1111", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("11001", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("01011", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("101111", null, AcceptState.Reject));
         ChallengeList.Add(challenge);


         // |34j-:|.14439j-|:.14458i165_.|_.34l_.|_175_:|:.34l_:.|:119-##
         challenge = new Challenge("Valley");
         challenge.pDescription = "Accept all strings which begin and end with two ones";
         challenge.pCredits = 7;
         challenge.pTests.Add(new ChallengeTest("", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("0", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("1", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("00", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("10", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("01", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("11011", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("010", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("000", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("0110", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("11001", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("101111", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("1111", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("11", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("111", null, AcceptState.Accept));
         ChallengeList.Add(challenge);

         // |55k56i141165_:.|.124.26i54314558i243141:|:.563_:.|:.165_:.|:.52k_:.|:.363_:.|:.161_:.##
         challenge = new Challenge("Flip");
         challenge.pDescription = "Move the last bit of the binary number to the front (e.g. '1000' becomes '0100')";
         challenge.pCredits = 8;
         challenge.pTests.Add(new ChallengeTest("", "", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0", "0", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("01", "10", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("001", "100", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10", "01", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("11", "11", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("110", "011", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("111", "111", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0000", "0000", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0001", "1000", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0010", "0001", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0110", "0011", AcceptState.DontCare));
         ChallengeList.Add(challenge);



         // |151.174181185181184_|.26i14439i14429i165194:.|13458k_165124:.|_:333_#####
         challenge = new Challenge("Replacer");
         challenge.pDescription = "Replace the all ocurrences of 010 with 110.";
         challenge.pCredits = 8;
         challenge.pTests.Add(new ChallengeTest("", "", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0", "0", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("01", "01", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10", "10", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("11", "11", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("001", "001", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("110", "110", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("111", "111", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("010", "110", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0100", "1100", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0110", "0110", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("01010", "11010", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("010010", "110110", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("011010", "011110", AcceptState.DontCare));
         ChallengeList.Add(challenge);

         // |151.17118118118455m_|.26i15e56i14456i.195:.|.54k194125.39i13e_|.165-.|.54k-.|.119-.###
         challenge = new Challenge("Equilibrium");
         challenge.pDescription = "Accept if the string has the same amount of zeroes and ones";
         challenge.pCredits = 10;
         challenge.pTests.Add(new ChallengeTest("", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("0", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("00", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("01", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("11", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("000", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("011", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("0011", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("101", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("111", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("1110", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("0110", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("1101", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("01110", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("111000", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("101010", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("101001", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("110001", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("100010001", null, AcceptState.Reject));
         ChallengeList.Add(challenge);


         // |151.171-|.54k24k194_:.|:19e171_:.######
         challenge = new Challenge("Zero out");
         challenge.pDescription = "Remove all zeroes from input string";
         challenge.pCredits = 12;
         challenge.pTests.Add(new ChallengeTest("", "", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0", "", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("01", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("001", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("11", "11", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("110", "11", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("111", "111", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("111011", "11111", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0000", "", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0001", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0010", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0110", "11", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("101010", "111", AcceptState.DontCare));
         ChallengeList.Add(challenge);

         // |151.171181_:.|.26i14e26i19e_:|13458j13458i_:.|:155-|:.59i164171181_|_36i14e36i19e:.|:.13458j13458i119:.##
         challenge = new Challenge("Odd/Even");
         challenge.pDescription = "Accept if the string has the an even amount of zeroes and an odd amount of ones";
         challenge.pCredits = 13;
         challenge.pTests.Add(new ChallengeTest("", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("0", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("1", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("10", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("01", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("110", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("011", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("001", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("010", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("100", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("00100", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("01000", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("10000", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("1100010", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("0100101", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("00000000111", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("01001000111", null, AcceptState.Accept));
         ChallengeList.Add(challenge);

         // |151.119-|.55h-.|134.26i141141141141161:.|56g.161_161:.|125.16e.52i119.16e:.|121.56i14532k29l18556m:.|.191124.16e:124:.|:191181181_:#
         challenge = new Challenge("Palindrom");
         challenge.pDescription = "Accept if the string is a palindrom (the string has the same value whether read backwards or forwards)";
         challenge.pCredits = 13;
         challenge.pTests.Add(new ChallengeTest("", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("0", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("1", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("10", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("01", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("110", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("011", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("001", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("010", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("100", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("00100", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("01000", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("10000", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("001100", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("001100", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("110100", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("0011100", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("0011000", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("1100010", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("0100101", null, AcceptState.Reject));
         ChallengeList.Add(challenge);


         // |151-:|.151-.|:36i184181181181_|:54l36i14e14558i393:.|:.194_:.####
         challenge = new Challenge("Sort");
         challenge.pDescription = "Move all ones to the front and all zeroes to the back";
         challenge.pCredits = 15;
         challenge.pTests.Add(new ChallengeTest("", "", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0", "0", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("01", "10", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("001", "100", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10", "10", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("11", "11", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("110", "110", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("111", "111", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("000", "000", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0000", "0000", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0001", "1000", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0010", "1000", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0110", "1100", AcceptState.DontCare));
         ChallengeList.Add(challenge);


         // |55i-:|.154_54j185:.|:59i14526i333.154:.|_26359g:27i563.|_135_194.####
         challenge = new Challenge("Increment");
         challenge.pDescription = "Increment the binary number in the tape by one. Reject if input string is empty";
         challenge.pCredits = 17;
         challenge.pTests.Add(new ChallengeTest("", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("0", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1", "10", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10", "11", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("11", "100", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("100", "101", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("101", "110", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("110", "111", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("111", "1000", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10000", "10001", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10101", "10110", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("011", "100", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0110", "111", AcceptState.DontCare));
         ChallengeList.Add(challenge);

         // |151-:|.56i141146141155_.|13426j_59k_|127166166:.174_|124383273.14156i_.|.191:13426j_.|_126167167_|_124383273_|_.191_.
         challenge = new Challenge("Echo");
         challenge.pDescription = "Duplicate the input string (e.g. string 110 becomes 110110)";
         challenge.pCredits = 18;
         challenge.pTests.Add(new ChallengeTest("", "", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0", "00", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1", "11", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10", "1010", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("11", "1111", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("100", "100100", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("101", "101101", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("110", "110110", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("011", "011011", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("111", "111111", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0110", "01100110", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1110", "11101110", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10000", "1000010000", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10101", "1010110101", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0000101", "00001010000101", AcceptState.DontCare));
         ChallengeList.Add(challenge);


         // |151:.164_:|.56i14558h146144161_|13426j:.14156i_|127166166:13426j_|125383273:126167167:.|.191:.124383273:.|_:191_##
         challenge = new Challenge("Reverse");
         challenge.pDescription = "Reverse the input string (e.g. string 110100 becomes 001011)";
         challenge.pCredits = 18;
         challenge.pTests.Add(new ChallengeTest("", "", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0", "0", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10", "01", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("11", "11", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("100", "001", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("101", "101", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("110", "011", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("011", "110", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("111", "111", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0110", "0110", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1110", "0111", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10000", "00001", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10101", "10101", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0000101", "1010000", AcceptState.DontCare));
         ChallengeList.Add(challenge);


         // |151-:|14455h184-|12428322l-|.12d-.#####
         challenge = new Challenge("Double zero");
         challenge.pDescription = "Duplicate all zeroes in the input string";
         challenge.pCredits = 18;
         challenge.pTests.Add(new ChallengeTest("", "", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0", "00", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("01", "001", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("001", "00001", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10", "100", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("11", "11", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("110", "1100", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("111", "111", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0000", "00000000", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0001", "0000001", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0010", "0000100", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0110", "001100", AcceptState.DontCare));
         ChallengeList.Add(challenge);


         // |151_:.176185.|.14155i14558i14414654j145147195|.13112438l:.164164:|13122k184:.23313624k:|12114514e16e:124383187:|.197283176_:.|:124-##
         challenge = new Challenge("Finder");
         challenge.pDescription = "Move all occurrences of a one followed by a zero to the front of the string (e.g. string 110100 becomes 101010)";
         challenge.pCredits = 25;
         challenge.pTests.Add(new ChallengeTest("", "", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0", "0", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("01", "01", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("001", "001", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10", "10", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("11", "11", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("110", "101", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("111", "111", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("000", "000", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0000", "0000", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0001", "0001", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0010", "1000", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0110", "1001", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1010", "1010", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("11110", "10111", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("11111", "11111", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("00100", "10000", AcceptState.DontCare));
         ChallengeList.Add(challenge);

         // |151:.14614558i14455i:|.16618118158g181181181124157.|.16b_:19419616b|.164:14e14558i14558g.194|.16714b144127_:|.16e126-|.56i124-|.124-.#
         challenge = new Challenge("Mixer");
         challenge.pDescription = "Generate the string that results of taking alternatively bits from another two strings separated with a green dot (e.g. For the strings 1011 and 0011 the result would be 10001111). Note: The two strings have the same length";
         challenge.pCredits = 28;
         challenge.pTests.Add(new ChallengeTest("", "", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0*0", "00", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1*0", "10", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10*11", "1101", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("11*00", "1010", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("100*111", "110101", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("101*000", "100010", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("110*110", "111100", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1000*0010", "10000100", AcceptState.DontCare));
         ChallengeList.Add(challenge);

         challenge = new Challenge("Equality");
         challenge.pDescription = "Accept if the two strings separated with a green dot are identical";
         challenge.pCredits = 30;
         challenge.pTests.Add(new ChallengeTest("0*0", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("1*0", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("10*11", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("11*11", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("110*110", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("111*11", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("111*100", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("1001*1001", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("1101*0", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("10010*10010", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("10101*10101", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("000*000", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("1111*111", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("10000*10000", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("101010*101011", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("101010*101010", null, AcceptState.Accept));
         ChallengeList.Add(challenge);

         // |151=:.|.36i14656i243151144141151:.16118e_:|13116418135i14e14154g185.161:16152i_:|121161.19114458i223:171:16112e_:|12156i151.191181181181187:.16152i_:|121161.14114114114114114114114115115112e_:|12136i14656i343151144141151:.14652i119_.|12116418125i14e14154g185.161.131-|.59i15119114458i323:171131-.|:.151191181181181187131-:|_141141141141131-:.#
         challenge = new Challenge("Third");
         challenge.pDescription = "Accept if binary number is a multiple of three";
         challenge.pCredits = 35;
         challenge.pTests.Add(new ChallengeTest("0", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("1", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("10", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("11", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("110", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("111", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("1001", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("1101", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("10010", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("10101", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("11111", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("11011", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("1001011", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("1111111", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("1101001", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("101010101011", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("101010101010", null, AcceptState.Accept));
         ChallengeList.Add(challenge);

         challenge = new Challenge("Container");
         challenge.pDescription = "Accept if the first string is contained in the second";
         challenge.pCredits = 32;
         challenge.pTests.Add(new ChallengeTest("0*0", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("1*0", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("10*1", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("10*11", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("11*11", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("110*110", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("111*11", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("1101*0", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("111*100", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("1*10101", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("10*10101", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("10*000111", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("1001*1001", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("10010*10010", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("10101*10101", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("100*10010", null, AcceptState.Accept));
         ChallengeList.Add(challenge);

         challenge = new Challenge("Sum");
         challenge.pDescription = "Sum two binary numbers separated by a green dot. Both numbers have at least one bit";
         challenge.pCredits = 35;
         challenge.pTests.Add(new ChallengeTest("0*0", "0", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0*1", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1*0", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1*1", "10", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10*11", "101", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("11*11", "110", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("111*111", "1110", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("011*100", "111", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10000*1", "10001", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10*101", "111", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10000*010", "10010", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0001*0001", "10", AcceptState.DontCare));
         ChallengeList.Add(challenge);

         challenge = new Challenge("Fifth");
         challenge.pDescription = "For multiples of five divide by five, otherwise reject";
         challenge.pCredits = 40;
         challenge.pTests.Add(new ChallengeTest("", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("1", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("0", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("11", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("10", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("101", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("100", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("1001", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("1010", "10", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1101", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("1111", "11", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10100", "100", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("11111", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("11001", "101", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("101101", "1001", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("111111", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("1000110", "1110", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1111111", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("10100100", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("11001000101", "101000001", AcceptState.DontCare));
         ChallengeList.Add(challenge);


         challenge = new Challenge("Power");
         challenge.pDescription = "Calculate the n-th power of 2 with n being the input binary number. (e.g. 101 = 100000)";
         challenge.pCredits = 40;
         challenge.pTests.Add(new ChallengeTest("0", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("01", "10", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10", "100", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("000", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("100", "10000", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1000", "100000000", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1010", "10000000000", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10000", "10000000000000000", AcceptState.DontCare));
         ChallengeList.Add(challenge);

         challenge = new Challenge("Count");
         challenge.pDescription = "Count how many times the first string appears in the second string. Strings are separated by a green dot";
         challenge.pCredits = 50;
         challenge.pTests.Add(new ChallengeTest("0*0", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0*1", "0", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1*0", "0", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1*1", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10*11", "0", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("11*11", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("111*111", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("00*100", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10000*1", "0", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10*10010", "10", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("11*111", "10", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10*010100010", "11", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1011*10101011", "1", AcceptState.DontCare));
         ChallengeList.Add(challenge);

         challenge = new Challenge("Search&Replace");
         challenge.pDescription = "Replace all occurrences of the first string found in the third string with the second string. Strings are separated by a green dot";
         challenge.pCredits = 60;
         challenge.pTests.Add(new ChallengeTest("0*1*000", "111", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0*1*101", "111", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("01*10*0010", "0100", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10*100*01010", "0100100", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("01*0001*000101", "0000010001", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("11**11111", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1010*0*10101010", "00", AcceptState.DontCare));
         ChallengeList.Add(challenge);

         challenge = new Challenge("Multiply");
         challenge.pDescription = "Multiply two binary numbers separated by a green dot. Both numbers have at least one bit";
         challenge.pCredits = 70;
         challenge.pTests.Add(new ChallengeTest("0*0", "0", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("0*1", "0", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1*0", "0", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1*1", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("001*0001", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10*11", "110", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("11*11", "1001", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("111*111", "110001", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("011*100", "1100", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10000*1", "10000", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("101*1011", "110111", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10000*010", "100000", AcceptState.DontCare));
         ChallengeList.Add(challenge);

         challenge = new Challenge("Prime finder");
         challenge.pDescription = "Accept only prime numbers between 1 and 11111";
         challenge.pCredits = 60;
         challenge.pTests.Add(new ChallengeTest("0", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("1", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("10", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("11", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("110", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("101", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("1110", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("1011", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("10111", null, AcceptState.Accept));
         challenge.pTests.Add(new ChallengeTest("11001", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("11111", null, AcceptState.Accept));
         ChallengeList.Add(challenge);

         challenge = new Challenge("Divide and conquer");
         challenge.pDescription = "Divide two binary numbers separated by a green dot. Both numbers have at least one bit";
         challenge.pCredits = 85;
         challenge.pTests.Add(new ChallengeTest("0*0", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("0*1", "0", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1*0", null, AcceptState.Reject));
         challenge.pTests.Add(new ChallengeTest("1*1", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10*11", "0", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("11*11", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("111*111", "1", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("011*100", "0", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("10000*1", "10000", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1011*10", "101", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("1011*11", "11", AcceptState.DontCare));
         challenge.pTests.Add(new ChallengeTest("111000*101", "1011", AcceptState.DontCare));
         ChallengeList.Add(challenge);

         int totalCredit = 0;
         foreach (Challenge c in ChallengeList) totalCredit += c.pCredits;
         Debug.WriteLine("Challenge count :" + ChallengeList.Count.ToString() + "\nCredits :" + totalCredit);

      }
   }
}
